#pragma once

#include<iostream>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/socket.h>
#include <sys/types.h>          
#include <arpa/inet.h>
#include <sys/fcntl.h>
#include <sys/epoll.h>
#include<vector>
#include<netinet/tcp.h>
#include"Channel.h"

class Channel;

class Epoll
{
private:
    // epoll_wait() 返回事件的数组大小
    static const int MaxEvents = 100;
    // epoll句柄，在构造函数中创建
    int epollfd_ = -1;
    // 存放 epoll_wait() 返回事件的数组，在构造函数中分配内存
    epoll_event events_[MaxEvents];

public:
    // 构造函数
    Epoll();
    // 析构函数
    ~Epoll();
    // 将 Channel 添加或者更新到红黑树上 [Channel 中既有fd，又有监视的事件]
    void updateChannel(Channel *ch);
    // 将 Channel 从红黑树上删除
    void removeChannel(Channel *ch);
    // 运行epoll_wait()，等待事件发生，已发送的事件用vector容器返回
    std::vector<Channel*> loop(int timeout = -1);
};